/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dca.sistemascontrole.malhadecontrole;

import dca.sistemascontrole.domain.VariaveisDeControle;
import dca.sistemascontrole.travas.GerenciadorDeTravas;
import dca.sistemascontrole.util.ControleConstantes;

/**
 *
 * @author Rafael
 */
public class ControladorPI extends MalhaFechada {

    private double up;
    private double ui;
    private double integralPI;
    private double uiAnterior;

    public ControladorPI(double setpoint, double kp, double ki, boolean usarFiltroAntiWindup) {
        super(setpoint);
        integralPI = 0;
        this.kp = kp;
        this.ki = ki;
        this.usarFiltroAntiWindup = usarFiltroAntiWindup;
        uiAnterior = 0;
    }

    @Override
    public int getTipo() {
        return PI;
    }

    @Override
    protected VariaveisDeControle getNextValue(long t, double nivelTanqueSuperior, double nivelTanqueInfeior) {
        double erro;
        double U;
        double Usat;
        double pv;

        if (ControleConstantes.PV_IS_TANQUE_SUPERIOR) {
            pv = nivelTanqueSuperior;
        } else {
            pv = nivelTanqueInfeior;
        }

        erro = variaveisDeControle.getSetPoint() - pv;
        integralPI = integralPI + ki * erro * 0.1;

        up = kp * erro;


        if (usarFiltroAntiWindup) {
            integralPI = integralPI + (uiAnterior * kp) / tw;
        }
        ui = integralPI;
        U = up + ui;
        Usat = GerenciadorDeTravas.ajustarAsTravas(pv, U);
        uiAnterior = (Usat - U);

//        if (usarFiltroAntiWindup) {
//            U = up + ui;
//            Usat = GerenciadorDeTravas.ajustarAsTravas(nivelTanqueSuperior, U);
////            integralPI = integralPI + ((Usat-U)*kp) / tauAk;
////            U = U + ((Usat - U) * kp) / tauAk;
//        } else {
//            U = up + ui;
//        }
        variaveisDeControle.setU(U);
        variaveisDeControle.setUp(up);
        variaveisDeControle.setUi(up);
        variaveisDeControle.setErro(erro);

        return variaveisDeControle;
    }
}
